home *** CD-ROM | disk | FTP | other *** search
/ SGI SNMP Access to HP-UX MIB 1.1.2 / SGI SNMP Access to HP-UX MIB 1.1.2.iso / dist / pcp_eoe.idb / var / pcp / pmns / Rebuild.z / Rebuild
Text File  |  1998-04-24  |  11KB  |  514 lines

  1. #!/bin/sh
  2. #
  3. # Copyright 1997, Silicon Graphics, Inc.
  4. # ALL RIGHTS RESERVED
  5. # UNPUBLISHED -- Rights reserved under the copyright laws of the United
  6. # States.   Use of a copyright notice is precautionary only and does not
  7. # imply publication or disclosure.
  8. # U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND:
  9. # Use, duplication or disclosure by the Government is subject to restrictions
  10. # as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights
  11. # in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or
  12. # in similar or successor clauses in the FAR, or the DOD or NASA FAR
  13. # Supplement.  Contractor/manufacturer is Silicon Graphics, Inc.,
  14. # 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311.
  15. # THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY
  16. # INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION,
  17. # DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY
  18. # PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON
  19. # GRAPHICS, INC.
  20. #Tag 0x00010D13
  21. #
  22. # Rebuild the binary PMNS, handling assorted errors
  23. #
  24. # $Id: Rebuild,v 2.45 1998/02/23 17:29:40 kenmcd Exp $
  25.  
  26. # Note. has to be run from where the PMNS files are installed, as
  27. #    pmnscomp uses dirname <root> as first in search path for #include
  28.  
  29. # Some degree of paranoia here ...
  30. PATH=/usr/sbin:/usr/bsd:/sbin:/usr/bin:/bin:/usr/pcp/bin
  31. export PATH
  32.  
  33. tmp=./$$
  34. status=1
  35. rm -f $tmp.*
  36. trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15
  37.  
  38. _trace()
  39. {
  40.     if $silent
  41.     then
  42.     :
  43.     else
  44.     if $nochanges
  45.     then
  46.         echo "$*"
  47.     else
  48.         echo "$*" >>$tmp.trace
  49.     fi
  50.     fi
  51. }
  52.  
  53. _syslog()
  54. {
  55.     logger -p user.alert -t PCP "$*"
  56.     _trace "$*"
  57. }
  58.  
  59. _die()
  60. {
  61.     [ -f $tmp.trace ] && cat $tmp.trace
  62.     exit
  63. }
  64.  
  65. prog=`basename $0`
  66. debug=false
  67. nochanges=false
  68. root=root
  69. root_updated=false
  70. update=false
  71. verbose=""
  72. dupok=""
  73. silent=false
  74.  
  75. _usage()
  76. {
  77.     _trace "Usage: Rebuild [-dnuv]"
  78.     _trace "Options:"
  79.     _trace "  -d    allow duplicate PMIDs in the PMNS"
  80.     _trace "  -n    dry run, show me what would be done"
  81.     _trace "  -s    silent, exit status says it all"
  82.     _trace "  -u    once only upgrade processing for a new PCP version"
  83.     _trace "  -v    verbose, for the paranoid"
  84. }
  85.  
  86. # Fixup "root" after PCP upgrade
  87. #
  88. _upgrade_root()
  89. {
  90.     [ ! -f root ] && return
  91.     _trace "Rebuild: PCP upgrade processing for \"root\" PMNS changes ..."
  92.  
  93.     # Exclude all deprecated PMNS include files
  94.     # and metrics from pcp1.2 and earlier.
  95.     #
  96.     # Only metrics and include files for add-on
  97.     # products will remain (except webmeter).
  98.     # 
  99.     $nochanges && _trace "+ cull irix names from PMNS ... <root >$tmp.root"
  100.     nawk <root >$tmp.root '
  101. BEGIN    {   # exclude these ones from the top-level names
  102.         #
  103.         exc = "irix hinv hw pmcd proc hpux hpuxhinv"
  104.         n = split(exc, e)
  105.         for (i=1; i <= n; i++) {
  106.         not_in_root[e[i]] = 1
  107.         }
  108.  
  109.         # do not #include any of these
  110.         #
  111.         no_inc = "kernel percpu disk memory swap network resource rpc nfs" \
  112.         " filesys ipc xfs engr proc pmcd hw irix-root irix-pmns"
  113.         n = split(no_inc, f)
  114.         for (i=1; i <= n; i++) {
  115.         not_included["\"" f[i] "\""] = 1
  116.         }
  117.         in_root = 0
  118.         skip = 0
  119.     }
  120. $1 == "root" && $2 == "\{"    { in_root = 1 }
  121. in_root && $1 == "\}"        { in_root = 0 }
  122. $1 == "\#include"        { if ($2 in not_included) next }
  123. in_root                { if ($1 in not_in_root) next }
  124. /^irix[ .]/ && $2 == "\{"    { skip = 1; next }
  125. /^hinv[ .]/ && $2 == "\{"    { skip = 1; next }
  126. /^hw[ .]/ && $2 == "\{"        { skip = 1; next }
  127. /^pmcd[ .]/ && $2 == "\{"    { skip = 1; next }
  128. /^proc[ .]/ && $2 == "\{"    { skip = 1; next }
  129. /^hpux[ .]/ && $2 == "\{"    { skip = 1; next }
  130. /^hpuxhinv[ .]/ && $2 == "\{"    { skip = 1; next }
  131. skip && $1 == "\}"        { skip = 0; next }
  132. skip                { next }
  133.                 { print }'
  134.     if cmp -s root $tmp.root >/dev/null 2>&1
  135.     then
  136.     # no changes ... already been here?
  137.     :
  138.     else
  139.     # we will usually end up here
  140.     root=$tmp.root
  141.     root_updated=true
  142.     fi
  143. }
  144.  
  145. # Handle PCP versions prior to 1.2, and merge changes there into the new
  146. # PMNS regime
  147. #
  148. _files_moved()
  149. {
  150.     _trace "Rebuild: PCP upgrade processing for migrated PMNS files ..."
  151.  
  152.     PMNS_OLD=${PMNS_OLD-/usr/pcp/pmns}
  153.     PMNS_NEW=${PMNS_NEW-/var/pcp/pmns}
  154.  
  155.     # if you cannot write $PMNS_OLD, don't bother updating this directory
  156.     # ... required for diskless systems where /usr is read-only
  157.     #
  158.     if touch $PMNS_OLD/.check >/dev/null 2>&1
  159.     then
  160.     rm -f $PMNS_OLD/.check
  161.     OLD_RM="$RM"
  162.     OLD_MV="$MV"
  163.     else
  164.     OLD_RM=:
  165.     OLD_MV="$CP"
  166.     fi
  167.     # similar test for the parent of $PMNS_OLD
  168.     #
  169.     if touch `dirname $PMNS_OLD`/.check >/dev/null 2>&1
  170.     then
  171.     rm -f `dirname $PMNS_OLD`/.check
  172.     OLD_LN="$LN"
  173.     else
  174.     OLD_LN=:
  175.     fi
  176.  
  177.     if [ -d $PMNS_NEW ]
  178.     then
  179.     # the new regime
  180.     if [ -l $PMNS_OLD ]
  181.     then
  182.         :
  183.     elif [ -d $PMNS_OLD ]
  184.     then
  185.         # PCP 1.2 fix-up
  186.         #
  187.         _trace "Relocating $PMNS_OLD files to $PMNS_NEW ..."
  188.  
  189.         # pass 1, get the likely "active" files
  190.         #
  191.         for file in $PMNS_OLD/*
  192.         do
  193.         case $file
  194.         in
  195.  
  196.             $tmp.*)
  197.                 ;;
  198.  
  199.             $PMNS_OLD'/*'|*.O|*.N)
  200.                 ;;
  201.  
  202.             */Brand|*/Makefile|*/Rebuild)
  203.                 eval $OLD_RM -f $file
  204.                 ;;
  205.  
  206.             *)
  207.                 base=`basename $file`
  208.                 if [ -f $base ]
  209.                 then
  210.                 # file in both places
  211.                 if diff -q $file $base >/dev/null
  212.                 then
  213.                    # no difference, easy option
  214.                    eval $OLD_RM -f $file
  215.                 else
  216.                     # not the same file
  217.                     if [ -f $base.N ]
  218.                     then
  219.                     # hard, old one becomes .O
  220.                     eval $RM -f $base.O
  221.                     eval $OLD_MV $file $base.O
  222.                     else
  223.                     # prefer old one, keep newie as .N
  224.                     eval $MV $base $base.N
  225.                     eval $OLD_MV $file $base
  226.                     fi
  227.                 fi
  228.                 else
  229.                 # not here, salvage from the other place
  230.                 eval $OLD_MV $file $base
  231.                 fi
  232.                 ;;
  233.         esac
  234.         done
  235.  
  236.         # pass 2, deal with the leftovers
  237.         #
  238.         for file in $PMNS_OLD/*
  239.         do
  240.         case $file
  241.         in
  242.             $PMNS_OLD'/*')
  243.                 ;;
  244.  
  245.             *)
  246.                 base=`basename $file`
  247.                 if [ ! -f $base ]
  248.                 then
  249.                 # copy across, no apparent conflict
  250.                 eval $OLD_MV $file $base
  251.                 else
  252.                 # nuke the old one
  253.                 eval $OLD_RM -f $file
  254.                 fi
  255.                 ;;
  256.         esac
  257.         done
  258.  
  259.         # cleanup
  260.         #
  261.         if [ "$PMNS_OLD" = "/usr/pcp/pmns" -a "$PMNS_NEW" = "/var/pcp/pmns" ]
  262.         then
  263.         # special case for PCP upgrades ...
  264.         #
  265.         eval $OLD_RM -rf $PMNS_OLD
  266.         eval $OLD_LN -s ../..$PMNS_NEW $PMNS_OLD
  267.         fi
  268.     elif [ -f $PMNS_OLD ]
  269.     then
  270.         # a file and not a dir not a symlink ... this is bad news
  271.         _syslog "$prog: \"$PMNS_OLD\" is neither a directory nor a symbolic link, cannot proceed"
  272.         _die
  273.     else
  274.         # does not exist, make symlink
  275.         eval $OLD_LN -s ../..$PMNS_NEW $PMNS_OLD
  276.     fi
  277.     fi
  278.  
  279.     if [ "`echo *.N`" != "*.N" ]
  280.     then
  281.     _trace "Warning: the following new PMNS files may have to be merged ..."
  282.     _trace "    `echo *.N`"
  283.     fi
  284. }
  285.  
  286. while getopts dnusv\? c
  287. do
  288.     case $c
  289.     in
  290.     d)    dupok="-d"
  291.         ;;
  292.     n)    nochanges=true
  293.         echo "$prog: Warning: dry run, no changes will be made"
  294.         ;;
  295.     u)    update=true
  296.         ;;
  297.     s)    silent=true
  298.         ;;
  299.     v)    verbose="-v"
  300.         ;;
  301.     \?)    _usage
  302.         status=0
  303.         _die
  304.         ;;
  305.     esac
  306. done
  307. shift `expr $OPTIND - 1`
  308.  
  309. # some preliminary checks
  310. #
  311. for file in /usr/pcp/lib/pmnsproc.sh /usr/pcp/bin/pmnsmerge /usr/pcp/bin/pmnscomp
  312. do
  313.     if [ ! -x $file ]
  314.     then
  315.     _syslog "$prog: $file is missing. Cannot proceed."
  316.     _die
  317.     fi
  318. done
  319.  
  320. . /usr/pcp/lib/pmnsproc.sh
  321.  
  322. if _can_load_ascii
  323. then
  324.     :
  325. else
  326.     # No license, nothing to do
  327.     #
  328.     $nochanges && _syslog "Warning: current PCP license does not allow PMNS updates"
  329.     status=0
  330.     _die
  331. fi
  332.  
  333. here=`pwd`
  334. _trace "Rebuilding the Performance Metrics Name Space (PMNS) in $here ..."
  335.  
  336. if [ $# -ne 0 ]
  337. then
  338.     _usage
  339.     _die
  340. fi
  341.  
  342. if $nochanges
  343. then
  344.     CP="_trace + cp"
  345.     MV="_trace + mv"
  346.     LN="_trace + ln"
  347.     RM="_trace + rm"
  348.     PMNSMERGE="_trace + /usr/pcp/bin/pmnsmerge ..."
  349. else
  350.     CP=cp
  351.     MV=mv
  352.     LN=ln
  353.     RM=rm
  354.     PMNSMERGE=
  355.  
  356.     id=`id | sed -e 's/(.*//' -e 's/.*=//'`
  357.     if [ "X$id" != X0 ]
  358.     then
  359.     _syslog "$prog: script must be run as \"root\", cannot proceed"
  360.     _die
  361.     fi
  362. fi
  363.  
  364. if $update
  365. then
  366.     # PCP upgrade fix ups
  367.     #
  368.     _files_moved
  369.     _upgrade_root
  370. fi
  371.  
  372. if [ -f $root ]
  373. then
  374.     haveroot=true
  375. else
  376.     haveroot=false
  377.     if $nochanges
  378.     then
  379.     _trace "+ create empty root PMNS ..."
  380.     else
  381.     root=$tmp.root
  382.     cat <<EOFEOF >$root
  383. root {
  384. }
  385. EOFEOF
  386.     fi
  387. fi
  388.  
  389. # Prior to Irix6.4 we did not ship any pmns files. To cater
  390. # for this we now ship the Irix pmns as part of root_pcp.
  391. #
  392. # The 6.4 Irix ism ships irix-pmns and irix-root. So, if root_irix
  393. # does not exist, we need to create it to include irix-pmns and
  394. # irix-root in the right places.
  395. #
  396. # After Irix 6.4, we will just ship root_irix.
  397. #
  398. # NOTE    This is here, and outside scope of -u processing because these
  399. #    changes may be needed by an IRIX upgrade after the PCP installation
  400. #    or upgrade
  401. #
  402. if [ -f irix-root -a -f irix-pmns -a ! -f root_irix ]
  403. then
  404.     # Create root_irix
  405.     if $nochanges
  406.     then
  407.     _trace "+ creating root_irix ..."
  408.     else
  409.     cat << EOFEOF > root_irix
  410. /*
  411.  * Irix PMNS for Irix 6.4
  412.  * frozen on 21 November 1996.
  413.  */
  414.  
  415. #define _DATESTAMP 961121
  416.  
  417. root {
  418. #include "irix-root"
  419. }
  420.  
  421. #include "irix-pmns"
  422. EOFEOF
  423.     fi
  424. fi
  425.  
  426. # Merge $root and root_* to produce the new root.
  427. # Each root_* file should be a complete namespace,
  428. # i.e. it should include an entry for root.
  429. # Some of these may be disabled with cpp conditional code.
  430. #
  431. mergelist=""
  432. if [ "`echo root_*`" != "root_*" ]
  433. then
  434.     mergelist=`ls -1 root_* | nawk '
  435.     /root_.*\.bin/    {next}
  436.     /root_web/        {next}
  437.     /root_.*\.[ON]/    {next}
  438.             {print}'`
  439. fi
  440.  
  441. _trace "$prog: merging the following PMNS files: "
  442. _trace $root $mergelist | fmt | sed -e 's/^/    /'
  443.  
  444. eval $RM -f $tmp.newroot
  445. eval $PMNSMERGE
  446. /usr/pcp/bin/pmnsmerge $verbose $dupok $root $mergelist $tmp.newroot >$tmp.out 2>&1
  447.  
  448. if [ $? != 0 -o ! -f $tmp.newroot.bin ]
  449. then
  450.     cat $tmp.out
  451.     _syslog "$prog: /usr/pcp/bin/pmnsmerge failed"
  452.     _trace "         \"root\" and \"root.bin\" have not been changed."
  453.     _die
  454. fi
  455.  
  456. # Multiple Rebuilds in succession should be a no-op.
  457. #
  458. if [ -f root ]
  459. then
  460.     cp root $tmp.tmp        # cp to avoid any root.bin problems
  461.     pminfo -m -n $tmp.tmp 2>/dev/null | sort >$tmp.list.old
  462. fi
  463. if [ ! -s $tmp.list.old ]
  464. then
  465.     cp $root $tmp.tmp        # cp to avoid any root.bin problems
  466.     pminfo -m -n $tmp.tmp 2>/dev/null | sort >$tmp.list.old
  467. fi
  468. pminfo -m -n $tmp.newroot | sort >$tmp.list.new
  469. if cmp -s $tmp.list.old $tmp.list.new > /dev/null 2>&1
  470. then
  471.     [ ! -f root ] && eval $MV $tmp.newroot root
  472.     [ ! -f root.bin ] && eval $MV $tmp.newroot.bin root.bin
  473.     _trace "$prog: PMNS is unchanged."
  474. else
  475.     # Install the new root
  476.     #
  477.     [ ! -z "$verbose" ] && cat $tmp.out
  478.     if $haveroot
  479.     then
  480.     _trace "$prog: PMNS \"$here/root\" updated."
  481.     _trace "... previous version saved as \"$here/root.prev\""
  482.     eval $MV root root.prev
  483.     else
  484.     _trace "$prog: new PMNS \"$here/root\" created."
  485.     fi
  486.     eval $MV $tmp.newroot root
  487.     eval $MV $tmp.newroot.bin root.bin
  488.  
  489.     # signal pmcd if it is running
  490.     #
  491.     pminfo -v pmcd.version >/dev/null 2>&1 && killall -HUP pmcd
  492.  
  493.     if [ ! -z "$verbose" ] && $haveroot
  494.     then
  495.     _trace "+ PMNS differences ..."
  496.     diff -c $tmp.list.old $tmp.list.new
  497.     _trace
  498.     _trace "+ root differences ..."
  499.     diff -c root.prev root
  500.     fi
  501. fi
  502.  
  503. # remake stdpmid
  504. #
  505. [ -f Make.stdpmid ] && ./Make.stdpmid
  506.  
  507. [ X"$verbose" = X-v -a -f $tmp.trace ] && cat $tmp.trace
  508.  
  509. status=0
  510. exit
  511.